package modelos.daos;

import controladores.ManejadorBaseDatos;
import modelos.pojos.Cliente;
import java.sql.*;
import java.util.LinkedList;
import java.util.List;

public class ClienteDAO {

    private static Connection con;
    public static List<Cliente> resultados;

    public static void crear(Cliente cliente) throws SQLException, Exception {

        ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
        mbd.conectar();
        con = mbd.getConexion();

        if (con == null) {
            throw new SQLException("Ha ocurrido un error al intentar conectarse con la base de datos");
        }

        PreparedStatement pst = null;

        try {
            pst = con.prepareStatement("Insert Into Cliente values(?,?,?,?,?,?,?)");
            pst.setString(1, null);
            pst.setString(2, cliente.getNombre());
            pst.setString(3, cliente.getUser());
            pst.setString(4, cliente.getCedula());
            pst.setString(5, cliente.getTelefono());
            pst.setString(6, cliente.getProcedencia());
            pst.setString(7, cliente.getEstado() + "");
            pst.executeUpdate();
        } finally {
            if (pst != null) {
                pst.close();
            }
        }
    }

    public static Cliente consultar(String cedula) throws SQLException {
        ResultSet rs = null;
        PreparedStatement pst = null;
        Cliente cliente = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("select * from Cliente where cedula = ?");
            pst.setString(1, cedula);

            rs = pst.executeQuery();

            while (rs.next()) {
                cliente = Cliente.cargarDatos(rs);

            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return cliente;
        }
    }

    public static List listar(String cedula) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pst = null;
        resultados = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("select * from Cliente where cedula like ?");
            pst.setString(1, "%" + cedula + "%");
            rs = pst.executeQuery();

            while (rs.next()) {
                if (resultados == null) {
                    resultados = new LinkedList<Cliente>();
                }
                resultados.add(Cliente.cargarDatos(rs));
            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return resultados;
        }
    }

    public static Cliente iniciar(String nombreUsuario, String cedula) throws SQLException {

        ResultSet rs = null;
        PreparedStatement pst = null;
        Cliente cliente = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("select * from Cliente where user = ? AND cedula = ? and estado = 'a'");
            pst.setString(1, nombreUsuario);
            pst.setString(2, cedula);
            rs = pst.executeQuery();

            while (rs.next()) {
                cliente = Cliente.cargarDatos(rs);
            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            return cliente;
        }
    }

    public static void actualizar(Cliente cliente) throws SQLException, Exception {
        int id = cliente.getId();

        PreparedStatement pst = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("Update Cliente Set nombre=?,telefono=?,cedula=?,procedencia=? Where id=?");
            pst.setString(1, cliente.getNombre());
            pst.setString(2, cliente.getTelefono());
            pst.setString(3, cliente.getCedula());
            pst.setString(4, cliente.getProcedencia());
            pst.setInt(5, id);
            pst.executeUpdate();

        } finally {
            if (pst != null) {
                pst.close();
            }
        }

    }

    public static void cambiarEstado(Cliente cliente, String cedula) throws SQLException, Exception {
        if (consultar(cedula) == null) {
        }

        PreparedStatement pst = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("Update Cliente Set estado=? Where cedula=?");
            pst.setString(1, cliente.getEstado() + "");
            pst.setString(2, cedula);
            pst.executeUpdate();

        } finally {
            if (pst != null) {
                pst.close();
            }
        }

    }

    public static void eliminar(String ced) throws SQLException, Exception {
        if (consultar(ced) == null) {
            throw new SQLException("");
        }
        PreparedStatement pst = null;

        try {
            ManejadorBaseDatos mbd = ManejadorBaseDatos.getInstancia();
            mbd.conectar();
            con = mbd.getConexion();
            pst = con.prepareStatement("delete from Cliente where codigo = ?");
            pst.setString(1, ced.trim());
            pst.executeUpdate();

        } finally {
            if (pst != null) {
                pst.close();
            }
        }

    }
}
